
                    Low Power noForth


Low power met de MSP430:  (Plaat-0)

Texas Instruments propageert met al hun voorbeelden voor de MSP430
het programmeren met Low Power altijd in gedachten. 
In het kort: (Plaat-1)

1) Het statusregister bevat de Low Power Modes (LPM) (plaat-2). 
2) Een actieve interrupt zet de LPM uit tijdens de interrupt!
3) Gebruik en zo hoog mogelijke klokfrequentie!? (plaat-3)
4) Laat de MSP430 hardware zoveel mogelijk zelf doen (plaat-4).
    RS232, PWM, ADC, Timer, SPI, I2C, Comparator, etc.
5) Ga zo diep mogelijk in slaap als de toepassing toe staat (plaat-5).
6) Neem een lage voedingspanning en juiste batterij
7) Zet externe devices indien mogelijk uit (plaat-6 en 7).
8) Gebruik zo min mogelijk code...


Implementatie ideen LPnF: (Beamertekst 1)

1) Na .OK in diepe slaap, in ACCEPT op 1 MHz en na ACCEPT op 8 MHz
    Nodig SLEEP, WAKE, 1MHZ en 8MHZ en een RX-interrupt vector
    Stroom in slaap 0,0005mA, in ACCEPT 0,35mA de rest 2,5mA

    Nadeel: Het omschakelen van de oscillators geeft problemen
    bij het gebruik van de UART.


2) Na .OK flink in slaap, baudrate generator en ACCEPT altijd op 32kHz, de rest op 1MHZ
    Nodig SLEEP, WAKE, 32KHZ en 1MHZ en een RX-interrupt vector
    Stroom in slaap 0,0005mA, RX 0,035mA de rest 0,35mA

    Nadeel: Het omschakelen van de oscillators geeft problemen
    bij het gebruik van de UART.
    

3) Default op 1 MHz, na .OK in diepe slaap, verder niets.
    Nodig SLEEP, WAKE, 1MHZ en een RX-interrupt vector
    Stroom in slaap 0,0005mA, RX 0,020mA de rest 0,35mA

    Nadeel: Je wilt niet altijd diep in slaap zijn. Vooral
    niet als er op de achtergrond iets bijgehouden moet worden.


4) Default op 1 MHz, bij KEY en EMIT in lichte slaap.
    Nodig (KEY), (EMIT), WAKE-RX, WAKE-TX en twee interrupt vectoren RX en TX
    Stroom op 8MHZ in slaap bij het wachten op KEY of EMIT 0,035mA, de rest 2,5mA

    Nadeel: Op 1 MHz loopt de interrupt code van EMIT vast. Laten
    we EMIT voorlopig weg dan hebben we eigenlijk variant 3!


* Het is handig om low power modes te kunnen kiezen.
* Voor alle varianten geldt dat een slapende MS met wakeup interrupt een verbetering is.
* Een extra systeem vector voor de kloksnelheid geeft noForth meer flexibiliteit.
* Ook het uitzetten van de leds levert een aanzienlijke besparing op! (Foto huidige noForth)


Benodigde onderdelen:

1) Vlag in OK voor het selecteren van Low Power mode (Foto actief)
2) Extra vector met kloksnelheid (default 8 MHz)
3) MS maken met behulp van een timer.   (Foto LPM0)
4) Wakeup interrupt routine voor KEY . (Foto LPM2)
5) Slaap routine voor aan het begin van ACCEPT . (Foto LPM4)
6) Besturing van de beide leds, mogelijk ook voor foutdetectie.

Extra:

* File met Low-Power modes
* Voorbeelden van Low-Power modes E58 t/m E63








Welke Low Power modes kent de MSP430:

Mode        Name            SR    Explanation
--------------------------------------------------------------------------
* AM   = Active Mode      - 00 - CPU & clocks active
* LPM0 = Low Power Mode 0 - 10 - CPU & MCLK disabled, DCO, SMCLK & ACLK active
* LPM1 = Low Power Mode 1 - 50 - Same as mode 0 except when DCO is not used
* LPM2 = Low Power Mode 2 - 90 - Only DC generator & ACLK active
* LPM3 = Low Power Mode 3 - D0 - Only ACLK active
* LPM4 = Low Power Mode 4 - F0 - CPU & clocks disabled

Meer info op de pagina's 41, etc. en pagina 46 van SLAU144J.PDF 


Stroomverbruik MSP430 met noForth: (Low power noForth stroomverbruik)

 - DCO freq.  -    LPM4    -      LPM2        -        LPM0         - Now in AM

    1 MHz        0,0006mA     0,022mA/0,35mA       0,070mA/0,35mA      0,35mA
    8 MHz        0,0006mA     0,025mA/2,60mA       0,345mA/2,60mA      2,60mA
   16 MHz        0,0006mA     0,033mA/5,20mA       0,682mA/5,20mA      5,20mA


Hoe gebruik je de Low Power Modes:

Algemeen:
    Wachtlussen worden veranderd in interrupts waarbij de MSP430
    in meer of mindere mate uitgezet wordt, zie de uitleg bij de
    Low Power Modes. We wachten tot de interrupt af gaat en deze
    moet de MSP weer wakker achter laten.


Voorbeeld-1 hardware interrupt (Voorbeeld-1 op beamer)

code INT-ON  	08 # 23 & .b bic  #8 sr bis  next  end-code
code INT-OFF    #8 sr bic  next  end-code
code SLEEP0     18 # sr bis  next  end-code \ Go from AM to LPM0
: RUNNER  	 	1  8 0 do  dup >leds  2*  50 ms  loop  drop ;

code HARDWARE-INTERRUPT
    08 # 23 & .b bic    \ Interrupt flag off
    F8 # rp ) bic		\ Interrupt off, CPU active again!
    reti
end-code

: LPM0      ( -- )
    port1-on  flash
    begin  runner  int-on  sleep0  key? until
    flash  int-off ;

' hardware-interrupt >body  FFE4 vec!   \ Set vector


Voorbeeld-2 RX-interrupt (voorbeeld-2 op beamer) 

: SLEEP-ON      ( -- )  \ Set LPM RS232 variant routines
    int-off
    F7 022 *bis         \ Only P1.3 is input
    41 021 *bic         \ Leds off
    FF 029 *bic         \ Set P2 low
    ['] key} to 'key ;  \ Replace vector

code WAKE-RX    ( -- )
    #1 001 & .b bic         \ RS232 RX int. off
    F0 # rp ) bic           \ LPM off
    reti
end-code

code KEY}       ( -- c )
    tos sp -) mov           \ Push TOS
    #1 003 & .b bit         \ Test RX flag
    =? if,                  \ Not set ?
        #1 001 & .b bis     \ RX interrupt on
        18 # sr bis         \ Go from AM to LPM0
    then,
    066 &  tos .b mov       \ Get char
    next
end-code

' wake-rx >body  FFEE vec!  \ RX intrpt.


Tenslotte is MS gemplementeerd met een watchdog interval interrupt.


Problemen:

In de huidige test implementatie van noForth is
geen Low Power variant van EMIT aanwezig. Bij testen
bleek dat de Low Power variant vannoForth prima loopt op
8 MHz en 16 MHz. De variant met EMIT loopt op 1 MHz vast.
Heeft er iemand een idee waarom, het test bestand is beschikbaar.

